# 读取shp文件生成geojson

import geopandas as gpd
import os
import json

def shp_to_geojson(shp_path, output_path=None):
    """
    将 SHP 文件转换为 GeoJSON 文件
    
    参数:
    shp_path: SHP 文件的路径
    output_path: 输出 GeoJSON 文件的路径（可选，默认在同目录下）
    
    返回:
    生成的 GeoJSON 文件路径
    """
    try:
        # 读取 SHP 文件
        gdf = gpd.read_file(shp_path, encoding='utf-8')
        
        # 确保坐标系统是 WGS84
        if gdf.crs is not None and gdf.crs != 'EPSG:4326':
            gdf = gdf.to_crs('EPSG:4326')
        
        # 如果未指定输出路径，则使用默认路径
        if output_path is None:
            output_path = os.path.splitext(shp_path)[0] + '.geojson'
        
        # 转换为 GeoJSON 并保存
        gdf.to_file(output_path, driver='GeoJSON', encoding='utf-8')
        
        # 读取生成的文件并格式化
        with open(output_path, 'r', encoding='utf-8') as f:
            data = json.load(f)
        
        # 重新写入，使用更紧凑的格式
        with open(output_path, 'w', encoding='utf-8') as f:
            json.dump(data, f, ensure_ascii=False, separators=(',', ':'))
        
        print(f'转换完成！文件已保存至：{output_path}')
        print(f'要素数量：{len(gdf)}')
        return output_path
        
    except Exception as e:
        print(f'转换过程中发生错误：{str(e)}')
        return None

if __name__ == '__main__':
    # 使用示例
    try:
        # 获取当前脚本所在目录
        current_dir = os.path.dirname(os.path.abspath(__file__))
        
        # 指定输入输出路径
        shp_folder = os.path.join(current_dir, 'shp')  # shp文件夹
        output_folder = os.path.join(current_dir, 'geojson')  # 输出文件夹
        
        # 确保输出文件夹存在
        os.makedirs(output_folder, exist_ok=True)
        
        # 获取所有shp文件
        shp_files = [f for f in os.listdir(shp_folder) if f.endswith('.shp')]
        
        if not shp_files:
            print("未找到任何SHP文件！")
        else:
            # 转换每个shp文件
            for shp_file in shp_files:
                shp_path = os.path.join(shp_folder, shp_file)
                output_path = os.path.join(output_folder, 
                                         os.path.splitext(shp_file)[0] + '.geojson')
                
                print(f'\n处理文件：{shp_file}')
                shp_to_geojson(shp_path, output_path)
                
    except Exception as e:
        print(f'程序执行出错：{str(e)}')
